home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000 #2
/
Ham Radio 2000 - Volume 2.iso
/
HAMV2
/
TCP_IP
/
TNOS230S
/
STATS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-09-06
|
12KB
|
566 lines
#include "global.h"
#ifdef STATS
#include "stats.h"
#if !defined(_lint)
static char rcsid[] OPTIONAL = "$Id: stats.c,v 1.16 1997/09/07 00:31:16 root Exp root $";
#endif
static void updatestats (void);
static void newhour (int hour);
static void newday (int hour);
static void endmonthclear (int hour, int month);
static void endday (int hour);
static void eachcycle (time_t now);
static int doSTATclear (int argc,char *argv[],void *p);
static int doSTATload (int argc,char *argv[],void *p);
static void loadstats (const char *name,void *beginning, void *ending);
static time_t statslast = 0;
const char dailyhdr[] = "\n%s per hour in the last 24 hours (excluding current hour)\n\n";
const char weeklyhdr[] = "\n%s per day in the last 7 days (excluding current day)\n\n";
const char monthlyhdr[] = "\n%s per day in the last month (excluding current day)\n\n";
const char yearlyhdr[] = "\n%s per month in the last year (excluding current month)\n\n";
const char STAT_emptystr[] = "";
const char STAT_dailytrailer[] =
"------------------------ ------------------------\n"
"0 0 0 0 0 1 1 1 1 1 2 2 Hour 0 0 0 0 0 1 1 1 1 1 2 2 Hour\n"
"0 2 4 6 8 0 2 4 6 8 0 2 0 2 4 6 8 0 2 4 6 8 0 2\n\n";
const char STAT_weeklytrailer[] =
"--------------------------------- ---------------------------------\n"
"SUN MON TUE WED THU FRI SAT SUN MON TUE WED THU FRI SAT\n\n";
const char STAT_monthlytrailer[] =
"------------------------------- -------------------------------\n"
" 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 Days 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 Days\n"
" 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0\n\n";
const char STAT_yearlytrailer[] =
"------------ ------------\n"
" 0 0 0 0 1 1 Month 0 0 0 0 1 1 Month\n"
" 2 4 6 8 0 2 2 4 6 8 0 2\n\n";
const char STAT_cannotclear[] = "Sorry, stats can only be cleared from the console\n";
static struct cmds STATScmds[] = {
#ifdef STATS_AREA
{ "area", doSTATarea, 0, 0, NULLCHAR },
#endif
{ "clear", doSTATclear, 0, 0, NULLCHAR },
#ifdef STATS_FWD
{ "forwarding", doSTATforward, 0, 0, NULLCHAR },
#endif
#ifdef STATS_HTTP
{ "http", doSTAThttp, 0, 0, NULLCHAR },
#endif
{ "load", doSTATload, 0, 0, NULLCHAR },
#ifdef STATS_MSG
{ "messages", doSTATmessage, 0, 0, NULLCHAR },
#endif
{ "save", doSTATsave, 0, 0, NULLCHAR },
#ifdef STATS_TFC
{ "traffic", doSTATtraffic, 0, 0, NULLCHAR },
#endif
#ifdef STATS_USE
{ "usage", doSTATusage, 0, 0, NULLCHAR },
#endif
{ NULLCHAR, NULL, 0, 0, NULLCHAR }
};
int
dostats (int argc, char *argv[], void *p)
{
return subcmd(STATScmds,argc,argv,p);
}
static int
doSTATclear (int argc, char *argv[], void *p)
{
int c;
struct mbuf *bp;
int done = 0;
if(Curproc->input != Command->input)
tputs (STAT_cannotclear);
else {
if (argc == 2)
c = argv[1][0];
else {
tputs ("\007Clear all statistics: Are you sure? ");
tflush ();
(void) recv_mbuf(Command->input,&bp,0,NULLCHAR,0);
c = bp->data[0];
}
if(c == 'y' || c == 'Y') {
done = 1;
#ifdef STATS_AREA
(void) doSTATclear_area(argc, argv, p);
#endif
#ifdef STATS_USE
(void) doSTATclear_use(argc, argv, p);
#endif
#ifdef STATS_FWD
(void) doSTATclear_fwd(argc, argv, p);
#endif
#ifdef STATS_MSG
(void) doSTATclear_msg(argc, argv, p);
#endif
#ifdef STATS_TFC
(void) doSTATclear_tfc(argc, argv, p);
#endif
#ifdef STATS_HTTP
(void) doSTATclear_http(argc, argv, p);
#endif
}
}
tprintf ("Statistics %scleared....\n", (done) ? "" : "not ");
return 0;
}
int
doSTATsave (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
{
FILE *fp;
char buffer[256];
sprintf (buffer, "%s/last", STATSDir);
fp = fopen (buffer, "w");
if (fp != NULLFILE) {
fprintf (fp, "Last: %ld\n", statslast);
(void) fclose (fp);
} else
log (-1, "Can't open stats file '%s/last'", STATSDir);
#ifdef STATS_AREA
savestats_area();
#endif
#ifdef STATS_USE
savestats_use();
#endif
#ifdef STATS_FWD
savestats_fwd();
#endif
#ifdef STATS_MSG
savestats_msg();
#endif
#ifdef STATS_TFC
savestats_tfc();
#endif
#ifdef STATS_HTTP
savestats_http();
#endif
return 0;
}
static int
doSTATload (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
{
loadstats ("last", &statslast, &statslast);
kwait (NULL);
#ifdef STATS_USE
loadstats_use();
#endif
#ifdef STATS_MSG
loadstats_msg();
#endif
#ifdef STATS_TFC
loadstats_tfc();
#endif
#ifdef STATS_AREA
loadstats_area();
#endif
#ifdef STATS_FWD
loadstats_fwd();
#endif
#ifdef STATS_HTTP
loadstats_http();
#endif
return 0;
}
static void
loadstats (const char *name, void *beginning, void *ending)
{
char buffer[256], *cp;
long *lp;
FILE *fp;
lp = (long *)beginning;
sprintf (buffer, "%s/%s", STATSDir, name);
fp = fopen (buffer, "r");
if (fp != NULLFILE) {
while (!feof(fp)) {
kwait (NULL);
(void) fgets (buffer, 79, fp);
if (feof(fp))
continue;
rip (buffer);
cp = strchr (buffer, ' ');
if (!cp) {
log (-1, "Error in loading stats file '%s/%s'", STATSDir, name);
(void) fclose (fp);
return;
}
*lp++ = atol (++cp);
if (lp > (long *)ending)
break;
cp = strchr (cp, ' ');
if (cp) {
*lp++ = atol (++cp);
if (lp > (long *)ending)
break;
}
}
(void) fclose (fp);
} else
log (-1, "Can't open stats file '%s/%s'", STATSDir, name);
kwait (NULL);
}
#if defined(STATS_USE) || defined(STATS_MSG) || defined(STATS_AREA) || defined(STATS_FWD) || defined(STATS_TFC) || defined(STATS_HTTP)
void
doGraph (int num, long array[][2])
{
long chart[31][2], highest[2], divisor[2];
int k, l, m;
int multiplyit[2];
highest[0] = highest[1] = 0L;
divisor[0] = divisor[1] = 1L;
multiplyit[0] = multiplyit[1] = 0;
for (k = 0; k < num; k++)
chart[k][0] = chart[k][1] = 0L;
for (k = 0; k < num; k++)
for (l = 0; l < 2; l++)
if (array[k][l] > highest[l])
highest[l] = array[k][l];
for (k = 0; k < 2; k++) {
if ((highest[k] < 10L) && highest[k]) {
multiplyit[k] = 1;
divisor[k] = (10 / highest[k]);
#if 0
if (divisor[k] < 2)
divisor[k] = 2;
#endif
} else if (highest[k] >= 10L)
divisor[k] = highest[k] / 10L;
}
for (k = 0; k < num; k++)
for (l = 0; l < 2; l++) {
if (multiplyit[l])
chart[k][l] = array[k][l] * divisor[l];
else {
chart[k][l] = array[k][l] / divisor[l];
if (array[k][l] % divisor[l])
chart[k][l]++;
}
if (chart[k][l] > 10L)
chart[k][l] = 10L;
}
for (m = 10; m ; m--) { /* each line */
for (l = 0; l < 2; l ++) {
for (k = 0; k < num; k++) {
if (chart[k][l] >= m) { /*lint !e771 */
if (num != 7)
tputc ('*');
else
tputs ("***");
} else {
if (num != 7)
tputc (' ');
else
tputs (" ");
}
if (num == 7)
tputs (" ");
}
if (!l) {
if (num != 7)
tputs (" ");
else
tputs (" ");
} else
tputc('\n');
}
}
}
#endif
static void
updatestats(void)
{
#ifdef STATS_AREA
updatestats_area ();
#endif
#ifdef STATS_USE
updatestats_use ();
#endif
#ifdef STATS_FWD
updatestats_fwd ();
#endif
#ifdef STATS_MSG
updatestats_msg ();
#endif
#ifdef STATS_TFC
updatestats_tfc ();
#endif
}
static void
newhour (int hour)
{
#ifdef STATS_AREA
newhour_area(hour);
#endif
#ifdef STATS_USE
newhour_use(hour);
#endif
#ifdef STATS_FWD
newhour_fwd(hour);
#endif
#ifdef STATS_MSG
newhour_msg(hour);
#endif
#ifdef STATS_TFC
newhour_tfc(hour);
#endif
#ifdef STATS_HTTP
newhour_http(hour);
#endif
}
static void
newday (int day)
{
#ifdef STATS_AREA
newday_area (day);
#endif
#ifdef STATS_USE
newday_use (day);
#endif
#ifdef STATS_FWD
newday_fwd (day);
#endif
#ifdef STATS_MSG
newday_msg (day);
#endif
#ifdef STATS_TFC
newday_tfc (day);
#endif
#ifdef STATS_HTTP
newday_http (day);
#endif
}
static void
endmonthclear (int day, int month)
{
#ifdef STATS_AREA
endmonthclear_area (day, month);
#endif
#ifdef STATS_USE
endmonthclear_use (day, month);
#endif
#ifdef STATS_FWD
endmonthclear_fwd (day, month);
#endif
#ifdef STATS_MSG
endmonthclear_msg (day, month);
#endif
#ifdef STATS_TFC
endmonthclear_tfc (day, month);
#endif
#ifdef STATS_HTTP
endmonthclear_http (day, month);
#endif
}
static void
endday (int day)
{
#ifdef STATS_AREA
endday_area (day);
#endif
#ifdef STATS_USE
endday_use (day);
#endif
#ifdef STATS_FWD
endday_fwd (day);
#endif
#ifdef STATS_MSG
endday_msg (day);
#endif
#ifdef STATS_TFC
endday_tfc (day);
#endif
#ifdef STATS_HTTP
endday_http (day);
#endif
}
static void
eachcycle (time_t now)
{
statslast = now;
#ifdef STATS_AREA
eachcycle_area (now);
#endif
#ifdef STATS_USE
eachcycle_use (now);
#endif
#ifdef STATS_FWD
eachcycle_fwd (now);
#endif
#ifdef STATS_MSG
eachcycle_msg (now);
#endif
#ifdef STATS_TFC
eachcycle_tfc (now);
#endif
#ifdef STATS_HTTP
eachcycle_http (now);
#endif
}
static void
init (time_t now)
{
statslast = 0;
#ifdef STATS_AREA
init_area (now);
#endif
#ifdef STATS_USE
init_use (now);
#endif
#ifdef STATS_FWD
init_fwd (now);
#endif
#ifdef STATS_MSG
init_msg (now);
#endif
#ifdef STATS_TFC
init_tfc (now);
#endif
#ifdef STATS_HTTP
init_http (now);
#endif
}
void
statsdaemon (int i OPTIONAL, void *v1 OPTIONAL, void *v2 OPTIONAL)
{
time_t now, then;
struct tm *t;
int lastmin = -1, hour, day;
then = now = time((time_t *)0);
init(now);
(void) doSTATload(0, (char **)0, (void *)0);
t = localtime(&now);
t->tm_min = 0;
then = mktime (t);
/* adjust in case previously not shut down properly */
if (statslast && statslast < then) {
/* adjust for missing hour */
hour = t->tm_hour - 1;
if (hour < 0)
hour = 23;
newhour (hour);
t->tm_hour = 0;
then = mktime (t);
if (statslast < then) {
/* adjust for missing day */
day = t->tm_wday - 1;
if (day < 0)
day = 6;
newday (day);
day = t->tm_mday - 2;
if (day < 0) { /* new month begins */
/* let the OS tell us the # of days in last month */
t->tm_mday = 1;
t->tm_hour = 0;
t->tm_sec = 0;
then = mktime (t);
then -= 3600;
t = localtime (&then);
day = t->tm_mday - 1;
endmonthclear (day + 1, t->tm_mon);
}
endday (day);
}
}
server_disconnect_io ();
for(;;){
(void) kpause(6000L); /* Run stats 10 times a minute, every 6 seconds */
updatestats();
now = time((time_t *)0);
t = localtime(&now);
if ((!t->tm_min && lastmin != t->tm_min) || (lastmin != -1 && lastmin > t->tm_min)) {
/* new hour begins */
hour = t->tm_hour - 1;
if (hour < 0)
hour = 23;
newhour (hour);
if (!t->tm_hour) { /* new day begins */
day = t->tm_wday - 1;
if (day < 0)
day = 6;
newday(day);
day = t->tm_mday - 2;
if (day < 0) { /* new month begins */
/* let the OS tell us the # of days in last month */
t->tm_mday = 1;
t->tm_hour = 0;
t->tm_sec = 0;
then = mktime (t);
then -= 3600;
t = localtime (&then);
day = t->tm_mday - 1;
endmonthclear (day + 1, t->tm_mon);
}
endday (day);
}
}
eachcycle (now);
if (!(t->tm_min % 10) && lastmin != t->tm_min)
(void) doSTATsave(0, (char **)0, (void *)0);
lastmin = t->tm_min;
}
}
#endif /* STATS */